#include <stdio.h>
#include <stdlib.h>
#include <string.h>




/**
 * @brief 从给定的日期字符串中提取年、月、日信息。
 *
 * 该函数使用sscanf函数从输入的日期字符串中解析出年、月、日的整数值，
 * 并将它们存储在对应的指针变量中。
 *
 * @param date_str 输入的日期字符串，格式应为"YYYY-MM-DD"。
 * @param year 指向存储年份的整型变量的指针。
 * @param month 指向存储月份的整型变量的指针。
 * @param day 指向存储日期的整型变量的指针。
 *
 * @return 无返回值。
 */
void inputDate(const char *date_str, int *year, int *month, int *day) {

    sscanf(date_str, "%d-%d-%d", year, month, day);
}




/**
 * @brief 检查给定的日期是否有效。
 *
 * 该函数接收年、月、日作为参数，判断该日期是否为一个有效的日期。
 * 首先，函数会判断给定的年份是否为闰年，如果是闰年则将二月的天数设为29天。
 * 然后，函数会检查月份是否在1到12之间，以及日期是否在对应月份的天数范围内。
 * 如果日期无效，则返回0；如果日期有效，则返回1。
 *
 * @param year 年份
 * @param month 月份
 * @param day 日期
 * @return int 日期是否有效，0表示无效，1表示有效
 */
int validDate(int year, int month, int day) {

    int days[] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31};

    // 判断是否为闰年，如果是闰年则将二月的天数设为29天
    if ((year % 4 == 0 && year % 100 != 0) || (year % 400 == 0)) {
        printf("闰年\n");
        days[1] = 29;
    }

    // 检查月份是否在1到12之间，以及日期是否在对应月份的天数范围内
    if (month < 1 || month > 12 || day < 1 || day > days[month - 1]) {
        return 0;
    }
    return 1;
}


/**
 * @brief 将输入的日期字符串转换为"dd/mm/yyyy"的格式
 *
 * 该函数接收一个日期字符串和一个字符数组，将输入的日期字符串解析为年、月、日，
 * 然后将这些信息格式化为"dd/mm/yyyy"的形式，并存储到提供的字符数组中。
 *
 * @param date_str 输入的日期字符串，格式由具体实现决定
 * @param decdate  用于存储转换后的日期字符串的字符数组
 */
void convertDate(const char *date_str, char *decdate) {
    int year, month, day;

    // 调用函数inputDate解析输入的日期字符串，获取年、月、日信息
    inputDate(date_str, &year, &month, &day);

    // 将年、月、日格式化为"dd/mm/yyyy"的形式，并存储到decdate中
    sprintf(decdate, "%02d/%02d/%04d", day, month, year);
}


int main() {
    char date_str[11];
    char decdate[11];


    printf("请输入日期 (YYYY-MM-DD): ");

    scanf("%s", date_str);

    int year, month, day;

    inputDate(date_str, &year, &month, &day);


    if (!validDate(year, month, day)) {

        printf("错误: 无效的日期。\n");
        return 1;
    }


    convertDate(date_str, decdate);

    printf("转换后的日期 (DD/MM/YYYY): %s\n", decdate);

    return 0;
}
